package br.com.ecommerce.sessionService;

import br.com.ecommerce.entity.enums.StatusTypeVenda;
import br.com.ecommerce.entity.impl.ItemVenda;
import br.com.ecommerce.entity.impl.Produto;
import br.com.ecommerce.entity.impl.Usuario;
import br.com.ecommerce.entity.impl.Venda;
import br.com.ecommerce.exceptions.BusinessException;
import br.com.ecommerce.util.ejb.AbstractService;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;

/**
 *
 * @author rpateixeira
 */
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class VendaServiceSession extends AbstractService<Venda>{
    
    public List<Venda> findVendasByDate(Date start,Date end){
         Map<String,Object> args = new HashMap<String, Object>();
         args.put("dataInicio", start);
         args.put("dataFim", end);
         return persistence.find("SELECT oEntidade FROM "+getEntityType().getSimpleName()+" oEntidade where oEntidade.dataVenda >= :dataInicio and oEntidade.dataVenda <= :dataFim", args);
    }

    public List<Venda> findVendasByStatus(StatusTypeVenda status){
         Map<String,Object> args = new HashMap<String, Object>();
         args.put("status", status);
         return persistence.find("SELECT oEntidade FROM "+getEntityType().getSimpleName()+" oEntidade where oEntidade.status =:status", args);
    }

    public List<Venda> findVendasByUsuario(Usuario usuario){
        Map<String,Object> args = new HashMap<String, Object>();
        args.put("usuario", usuario);
        return persistence.find("SELECT oEntidade FROM "+getEntityType().getSimpleName()+" oEntidade where oEntidade.usuario=:usuario", args);
    }

    public List<Produto> findLastSelledProducts(){
        return persistence.find("SELECT DISTINCT(si.produto) FROM ItemVenda si where si order by si.venda.dataVenda desc", null,10);
    }
    private void confirmaVenda(Venda venda){
        System.out.println("The products has been selled..."+venda);
    }

    @Override
    public Venda insert(Venda t) {
        if(!isCreditCardValidForSell(t)){
            throw new BusinessException("Cartão de credito Invalido para essa Venda!!!");
        }
        t=super.insert(t);
        confirmaVenda(t);
        for(ItemVenda itemVenda:t.getItensVenda()){
            itemVenda.getProduto().setStock(itemVenda.getProduto().getStock()-itemVenda.getQuantidadeProdutos());
        }
        setStatusOfSell(t,StatusTypeVenda.INPROGRESS);
        return t;
    }

    public Venda fecharVenda(Venda venda){
        persistence.refresh(venda);
        venda.setVendaFechada(true);
        setStatusOfSell(venda,StatusTypeVenda.DONE);
        return update(venda);
    }
    public boolean isCreditCardValidForSell(Venda venda){
        setStatusOfSell(venda,StatusTypeVenda.VALID);
        System.out.println("The Credit is been Validated !"+venda.getCreditCard());
        return true;
    }

    private void setStatusOfSell(Venda venda, StatusTypeVenda statusTypeVenda) {
        System.out.println("Send email to User");
    }
}
